package com.api.sw.duban.util;

import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.alibaba.fastjson.JSONObject;
import com.api.sw.duban.model.Uf_jcdcrw;
import com.itextpdf.text.log.SysoCounter;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.TextAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.apache.poi.xwpf.usermodel.XWPFRelation;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.docx4j.wml.STPageOrientation;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import com.api.sw.duban.model.ParagraphStyle;
import com.api.sw.duban.model.TextStyle;
import weaver.general.Util;

/**
 * @Description 设置docx文档的样式及一些操作
 * @Author  Huangxiaocong
 * 2018年12月1日  下午12:18:41
 * 基本概念说明：XWPFDocument代表一个docx文档，其可以用来读docx文档，也可以用来写docx文档
 *     XWPFParagraph代表文档、表格、标题等种的段落，由多个XWPFRun组成
 *     XWPFRun代表具有同样风格的一段文本
 *  XWPFTable代表一个表格
 *  XWPFTableRow代表表格的一行
 *  XWPFTableCell代表表格的一个单元格
 *  XWPFChar 表示.docx文件中的图表
 *  XWPFHyperlink 表示超链接
 *  XWPFPicture  代表图片
 *
 *  注意：直接调用XWPFRun的setText()方法设置文本时，在底层会重新创建一个XWPFRun。
 */
public class XWPFHelper {
    private static Logger logger = Logger.getLogger(XWPFHelper.class.toString());

    /**
     * 创建一个word对象
     * @return
     * @Author Huangxiaocong 2018年12月1日 上午11:56:35
     */
    public XWPFDocument createDocument() {
        XWPFDocument document = new XWPFDocument();
        return document;
    }
    /**
     * 打开word文档
     * @param path 文档所在路径
     * @return
     * @throws IOException
     * @Author Huangxiaocong 2018年12月1日 下午12:30:07
     */
    public XWPFDocument openDoc(String path) throws IOException {
        InputStream is = new FileInputStream(path);
        return new XWPFDocument(is);
    }
    /**
     * 保存word文档
     * @param document 文档对象
     * @param savePath    保存路径
     * @throws IOException
     * @Author Huangxiaocong 2018年12月1日 下午12:32:37
     */
    public void saveDocument(XWPFDocument document, String savePath) throws IOException {
        OutputStream os = new FileOutputStream(savePath);
        document.write(os);
        os.close();
    }
    public void saveDocument(XWPFDocument document, OutputStream os) throws IOException {
        //OutputStream os = new FileOutputStream(savePath);
        document.write(os);
        os.flush();
        os.close();


    }
    /**
     * 设置段落文本样式  设置超链接及样式
     * @param paragraph
     * @param textStyle
     * @Author Huangxiaocong 2018年12月1日 下午3:56:32
     */
    public void addParagraphTextHyperlink(XWPFParagraph paragraph, TextStyle textStyle) {
        String id = paragraph.getDocument().getPackagePart().
                addExternalRelationship(textStyle.getUrl(),
                        XWPFRelation.HYPERLINK.getRelation()).getId();
        //追加链接并将其绑定到关系中
        CTHyperlink cLink = paragraph.getCTP().addNewHyperlink();
        cLink.setId(id);
        //创建链接文本
        CTText ctText = CTText.Factory.newInstance();
        ctText.setStringValue(textStyle.getText());
        CTR ctr = CTR.Factory.newInstance();
        CTRPr rpr = ctr.addNewRPr();
        //以下设置各种样式 详情看TextStyle类
        if(textStyle.getFontFamily() != "" && textStyle.getFontFamily() != null     ) {
            CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
            fonts.setAscii(textStyle.getFontFamily());
            //...
        }
        //设置字体大小
    }
    /**
     * 设置段落的基本样式  设置段落间距信息， 一行 = 100    一磅=20
     * @param paragraph
     * @param paragStyle
     * @Author Huangxiaocong 2018年12月1日 下午4:27:17
     */
    public void setParagraphSpacingInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle, STLineSpacingRule.Enum lineValue) {
        CTPPr pPPr = getParagraphCTPPr(paragraph);
        CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing() : pPPr.addNewSpacing();
        if(paragStyle.isSpace()) {
            //段前磅数
            if(paragStyle.getBefore() != null) {
                pSpacing.setBefore(new BigInteger(paragStyle.getBefore()));
            }
            //段后磅数
            if(paragStyle.getAfter() != null) {
                pSpacing.setAfter(new BigInteger(paragStyle.getAfter()));
            }
            //依次设置段前行数、段后行数
            //...
        }
        //间距
        if(paragStyle.isLine()) {
            if(paragStyle.getLine() != null) {
                pSpacing.setLine(new BigInteger(paragStyle.getLine()));
            }
            if(lineValue != null) {
                pSpacing.setLineRule(lineValue);    //
            }
        }
    }
    /**
     * 设置段落缩进信息  1厘米 约等于 567
     * @param paragraph
     * @param paragStyle
     * @Author Huangxiaocong 2018年12月1日 下午7:59:35
     */
    public void setParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) {
        CTPPr pPPr = getParagraphCTPPr(paragraph);
        CTInd pInd = pPPr.getInd() != null ? pPPr.getInd() : pPPr.addNewInd();
        if(paragStyle.getFirstLine() != null) {
            pInd.setFirstLine(new BigInteger(paragStyle.getFirstLine()));
        }
        //再进行其他设置
        //...
    }
    /**
     * 设置段落对齐 方式
     * @param paragraph
     * @param pAlign
     * @param valign
     * @Author Huangxiaocong 2018年12月1日 下午8:54:43
     */
    public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {
        if(pAlign != null) {
            paragraph.setAlignment(pAlign);
        }
        if(valign != null) {
            paragraph.setVerticalAlignment(valign);
        }
    }
    /**
     * 得到段落的CTPPr
     * @param paragraph
     * @return
     * @Author Huangxiaocong 2018年12月1日 下午7:36:10
     */
    public CTPPr getParagraphCTPPr(XWPFParagraph paragraph) {
        CTPPr pPPr = null;
        if(paragraph.getCTP() != null) {
            if(paragraph.getCTP().getPPr() != null) {
                pPPr = paragraph.getCTP().getPPr();
            } else {
                pPPr = paragraph.getCTP().addNewPPr();
            }
        }
        return pPPr;
    }
    /**
     * 得到XWPFRun的CTRPr
     * @param paragraph
     * @param pRun
     * @return
     * @Author Huangxiaocong 2018年12月1日 下午7:46:01
     */
    public CTRPr getRunCTRPr(XWPFParagraph paragraph, XWPFRun pRun) {
        CTRPr ctrPr = null;
        if(pRun.getCTR() != null) {
            ctrPr = pRun.getCTR().getRPr();
            if(ctrPr == null) {
                ctrPr = pRun.getCTR().addNewRPr();
            }
        } else {
            ctrPr = paragraph.getCTP().addNewR().addNewRPr();
        }
        return ctrPr;
    }


    /**
     * 复制表格
     * @param targetTable
     * @param sourceTable
     * @Author Huangxiaocong 2018年12月1日 下午1:40:01
     */
    public void copyTable(XWPFTable targetTable, XWPFTable sourceTable) {
        //复制表格属性
        targetTable.getCTTbl().setTblPr(sourceTable.getCTTbl().getTblPr());
        //复制行
        for(int i = 0; i < sourceTable.getRows().size(); i++) {
            XWPFTableRow targetRow = targetTable.getRow(i);
            XWPFTableRow sourceRow = sourceTable.getRow(i);
            if(targetRow == null) {
                targetTable.addRow(sourceRow);
            } else {
                copyTableRow(targetRow, sourceRow);
            }
        }
    }
    /**
     * 复制单元格
     * @param targetRow
     * @param sourceRow
     * @Author Huangxiaocong 2018年12月1日 下午1:33:22
     */
    public void copyTableRow(XWPFTableRow targetRow, XWPFTableRow sourceRow) {
        //复制样式
        if(sourceRow != null) {
            targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
        }
        //复制单元格
        for(int i = 0; i < sourceRow.getTableCells().size(); i++) {
            XWPFTableCell tCell = targetRow.getCell(i);
            XWPFTableCell sCell = sourceRow.getCell(i);
            if(tCell == sCell) {
                tCell = targetRow.addNewTableCell();
            }
            copyTableCell(tCell, sCell);
        }
    }
    /**
     * 复制单元格（列） 从sourceCell到targetCell
     * @param targetCell
     * @param sourceCell
     * @Author Huangxiaocong 2018年12月1日 下午1:27:38
     */
    public void copyTableCell(XWPFTableCell targetCell, XWPFTableCell sourceCell) {
        //表格属性
        if(sourceCell.getCTTc() != null) {
            targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
        }
        //删除段落
        for(int pos = 0; pos < targetCell.getParagraphs().size(); pos++) {
            targetCell.removeParagraph(pos);
        }
        sourceCell.getParagraphs();
        //添加段落
        for(Object sourceParag1 : sourceCell.getParagraphs()) {
            XWPFParagraph sourceParag=(XWPFParagraph)sourceParag1;
            XWPFParagraph targetParag = targetCell.addParagraph();
            copyParagraph(targetParag, sourceParag);
        }
    }
    /**
     * 复制段落，从sourceParag到targetParag
     * @param targetParag
     * @param sourceParag
     * @Author Huangxiaocong 2018年12月1日 下午1:16:26
     */
    public void copyParagraph(XWPFParagraph targetParag, XWPFParagraph sourceParag) {
        targetParag.getCTP().setPPr(sourceParag.getCTP().getPPr());    //设置段落样式
        //移除所有的run
        for(int pos = targetParag.getRuns().size() - 1; pos >= 0; pos-- ) {
            targetParag.removeRun(pos);
        }
        //copy新的run
        for(Object sRun1 : sourceParag.getRuns()) {
            XWPFRun sRun=(XWPFRun)sRun1;
            XWPFRun tarRun = targetParag.createRun();
            copyRun(tarRun, sRun);
        }
    }
    /**
     * 复制XWPFRun 从sourceRun到targetRun
     * @param targetRun
     * @param sourceRun
     * @Author Huangxiaocong 2018年12月1日 下午12:56:53
     */
    public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) {
        //设置targetRun属性
        targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());
        targetRun.setText(sourceRun.text());//设置文本
        //处理图片
        List<XWPFPicture> pictures = sourceRun.getEmbeddedPictures();
        for(XWPFPicture picture : pictures) {
            try {
                copyPicture(targetRun, picture);
            } catch (InvalidFormatException e) {
                e.printStackTrace();
                logger.log(Level.WARNING, "copyRun", e);
            } catch (IOException e) {
                e.printStackTrace();
                logger.log(Level.WARNING, "copyRun", e);
            }
        }
    }
    /**
     * 复制图片从sourcePicture到 targetRun（XWPFPicture --> XWPFRun）
     * @param targetRun
     * @throws IOException
     * @throws InvalidFormatException
     * @Author Huangxiaocong 2018年12月1日 下午12:57:33
     */
    public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throws InvalidFormatException, IOException {
        XWPFPictureData picData = sourcePicture.getPictureData();
        String fileName = picData.getFileName();    //图片的名称
        InputStream picInIsData = new ByteArrayInputStream(picData.getData());
        int picType = picData.getPictureType();
        int width = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCx();
        int height =  (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCy();
        targetRun.addPicture(picInIsData, picType, fileName, width, height);
//        targetRun.addBreak();//分行
    }

    //跨行合并单元格
    public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    public static void main12(String[] args) throws Exception {
        ExportWord ew = new ExportWord();
        XWPFDocument document = ew.createXWPFDocument(10,6);

        List<String> title = new ArrayList<String>();
        List<List<String>> list = new ArrayList<List<String>>();

        List<String> tempList = new ArrayList<String>();
        tempList.add("标题1");
        tempList.add("标题2");
        tempList.add("标题3");
        tempList.add("标题4");
        tempList.add("标题5");
        tempList.add("标题6");
        list.add(tempList);

        tempList = new ArrayList<String>();
        tempList.add("姓名");
        tempList.add("姓名");
        tempList.add("性别");
        tempList.add("男");
        tempList.add("出生日期");
        tempList.add("2018-10-10");
        list.add(tempList);

        tempList = new ArrayList<String>();
        tempList.add("姓名");
        tempList.add("姓名");
        tempList.add("性别");
        tempList.add("男2");
        tempList.add("出生日期");
        tempList.add("2018-10-10");
        list.add(tempList);

        tempList = new ArrayList<String>();
        tempList.add("姓名");
        tempList.add("黄xx1");
        tempList.add("性别1");
        tempList.add("男1");
        tempList.add("出生日期1");
        tempList.add("2018-10-101");
        list.add(tempList);
        tempList = new ArrayList<String>();
        tempList.add("姓名2");
        tempList.add("黄xx");
        tempList.add("性别1");
        tempList.add("男1");
        tempList.add("出生日期1");
        tempList.add("2018-10-101");
        list.add(tempList);

        for(int i=0;i<200;i++){
            tempList = new ArrayList<String>();
            tempList.add("姓名2"+i);
            tempList.add("黄xx"+i);
            tempList.add("性别1"+i);
            tempList.add("男1"+i);
            tempList.add("出生日期1"+i);
            tempList.add("2018-10-101"+i);
            //list.add(tempList);
        }

        String[] value_columns={"姓名2","姓名2","姓名2","姓名2","姓名2","姓名2"};

        List<String> title11 = new ArrayList<String>();
        title11.add("哈哈");
        Map<String, Object> dataList = new HashMap<String, Object>();
        dataList.put("TITLE", "个人体检表");
        dataList.put("TABLEDATA", list);
        //dataList.put("TABLEDATA", new ArrayList<List<Object>>());
        //ew.exportCheckWord(dataList, document, "D:/expWordTest15.docx");
        WordExport WordExport=new WordExport(26002,16840);
        int[] colWidths={3700,3700,3700,3700,3700,3700};
        WordExport.makeWord(title11,list, title, "",colWidths,"D:/expWordTest15.docx");
        //ExportUtil.exportWord( "个人体检表", value_columns, list, colWidths, 1, 6,26002,16840);
        System.out.println("文档生成成功");
    }
    public static void main1(String[] arg){
        StringBuilder sb=new StringBuilder();

        String filePath="D:\\e9\\ecology\\tempfile\\Excel1699098732.docx";//""d:"+ File.separator+"年度重点工作任务分解计划汇总.doc";
        try (FileInputStream in = new FileInputStream(filePath); // 载入文档
             POIFSFileSystem pfs = new POIFSFileSystem(in);
             HWPFDocument hwpf = new HWPFDocument(pfs);) {

            Range range = hwpf.getRange();// 得到文档的读取范围
            TableIterator it = new TableIterator(range);
            // 迭代文档中的表格
            String tableName="第一个";
            while (it.hasNext()) {
                Table tb = (Table) it.next();
                System.out.println(tb.numRows());
                // 迭代行，默认从0开始,可以依据需要设置i的值,改变起始行数，也可设置读取到那行，只需修改循环的判断条件即可
                outer:for (int i = 0; i < tb.numRows(); i++) {
                    TableRow tr = tb.getRow(i);
                    // 迭代列，默认从0开始
                    for (int j = 0; j < tr.numCells(); j++) {
                        TableCell td = tr.getCell(j);// 取得单元格
                        // 取得单元格的内容
                        for (int k = 0; k < td.numParagraphs(); k++) {
                            Paragraph para = td.getParagraph(k);
                            String s = para.text();
                            // 去除后面的特殊符号
                            if (null != s && !"".equals(s)) {
                                s = s.substring(0, s.length() - 1);
                            }
                            s=s.trim();
                            System.out.println(s);
                            if(tableName.trim().equals(s)||i!=0) {
                                sb.append(s + "\t");
                            } else {
                                break outer;
                            }
                        }
                    }
                    sb.append( "\n");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        //return sb.toString();
    }
    /*
        考虑到合并列的问题 需要考虑 获取 json 中保留的数据   key cell value  从多少行到多少行
     */
    public static void main2(String[] arg){

//"D:\\e9\\ecology\\tempfile\\Excel1699098732.docx";//
        String filePath="D:\\e9\\ecology\\tempfile\\Excel1699098732.doc";//"d:"+ File.separator+"年度重点工作任务分解计划汇总.doc";
        try (FileInputStream in = new FileInputStream(filePath); // 载入文档

            XWPFDocument doc = new XWPFDocument(in);) {

            JSONObject datajson=new JSONObject();
            List tables = doc.getTables();
            List rows;
            List cells;
            for (Object table1 : tables) { // 表格属性
                XWPFTable table=(XWPFTable)table1;
                CTTblPr pr = table.getCTTbl().getTblPr(); // 获取表格对应的行
                rows = table.getRows();
                for (int rowi=0;rowi<rows.size();rowi++) { // 获取行对应的单元格
                //for (Object row1 : rows) { // 获取行对应的单元格
                    XWPFTableRow row=(XWPFTableRow)rows.get(rowi);
                    cells = row.getTableCells();
                    System.out.println(cells.size());

                    //for (Object cell1 : cells) {
                     for (int cel1=0;cel1<cells.size();cel1++) {
                        XWPFTableCell cell=(XWPFTableCell)cells.get(cel1);
                        CTVMerge CTVMerge=cell.getCTTc().getTcPr().getVMerge();
                        String bs="";
                        if(CTVMerge!=null&&CTVMerge.isSetVal()){
                            bs=CTVMerge.getVal().toString();
                        }

                         List<XWPFParagraph> Paragraphs= cell.getParagraphs();
                         StringBuilder sb=new StringBuilder();
                         for (int k = 0; k < Paragraphs.size(); k++) {
                             XWPFParagraph para = (XWPFParagraph)Paragraphs.get(k);
                             String s = para.getText();
                             // 去除后面的特殊符号
                             if (null != s && !"".equals(s)) {
                                 s = s.substring(0, s.length() - 1);
                             }
                             s = s.trim();
                             sb.append(s + "\t");
                         }
                        System.out.println(setDataJson(datajson,cel1,rowi,cell.getText(),bs));
                    }
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

        //return sb.toString();
    }
public static void main(String[] arg){
       // System.out.println(qchx("-ad-"));
    String filePath="D:\\123.docx";//"d:"+ File.separator+"年度重点工作任务分解计划汇总.doc";
    try (FileInputStream in = new FileInputStream(filePath); // 载入文档

         XWPFDocument doc = new XWPFDocument(in);) {
        List tables = doc.getTables();
        List rows;
        List cells;
        for (Object table1 : tables) { // 表格属性
            XWPFTable table = (XWPFTable) table1;
            getCellbinRow(table);
            System.out.println("12321$".endsWith("$"));
        }

    }catch(Exception e){
            System.out.println(e.getMessage());
    }
}
    /*
        行的 合并 json
     */
    public static String getCellbinRow(XWPFTable table){
        List<Uf_jcdcrw> List=new ArrayList<Uf_jcdcrw>();
        JSONObject json=new JSONObject();
        JSONObject jsonkey=new JSONObject();//记录上级 通过cell 以及行区间
        int mainid=1;
        Uf_jcdcrw uf_jcdcrw=null;
        long rowkey=System.currentTimeMillis();
        int cellz=2;
        JSONObject leveljson=new JSONObject();//保留所有的上级
        for(int cell=0;cell<cellz;cell++){
            List  rows = table.getRows();
            int begin=1;
            int end=1;
            boolean istart=false;
            String data="";

            for (int rowi=1;rowi<rows.size();rowi++) { // 获取行对应的单元格  从第一行开始

                XWPFTableRow row=(XWPFTableRow)rows.get(rowi);
                XWPFTableCell democell=(XWPFTableCell)row.getTableCells().get(cell);
                if(democell==null){
                    return "列为空";
                }
                CTVMerge CTVMerge=democell.getCTTc().getTcPr().getVMerge();
                if(CTVMerge!=null&&CTVMerge.isSetVal()){
                        //记录一下 开始 以及结束
                    if(!istart){
                        istart=true;
                        begin=rowi;
                        data=democell.getText();
                        continue;
                    }else{
                        if(rowi==(rows.size()-1)){//是否是最后一行
                            end=rowi;
                        }else{
                            //判断下一个是不是 合并单元格

                                    if(checkEnd(( (XWPFTableCell)((XWPFTableRow)rows.get(rowi+1)).getCell(cell)))){
                                        continue;//已经设置了 不需要在设置了
                                    }else{//不是的话 设置id
                                        end=rowi;
                                        istart=false;//结束合并
                                    }

                        }

                    }
                }else{
                    if(istart){//结束合并 说明之前 有合并
                        //System.out.println(rowi);
                        //需要设置上一个
                        end=rowi;
                        istart=false;//结束合并
                        //begin=rowi;//重置第一行
                    }else{
                        begin=rowi;//重置第一行
                        data=democell.getText();
                        //begin=rowi;//重置第一行
                        end=rowi;
                    }
                    if(rowi==(rows.size()-1)) {//是否是最后一行
                        begin=rowi;//重置第一行
                        data=democell.getText();
                        end=rowi;
                    }

                }

                JSONObject demonid= jsonkey.getJSONObject(cell+"");
                if(demonid==null){
                    demonid=new JSONObject();
                    //System.out.println(begin+","+end);
                    demonid.put(begin+","+end,rowkey);
                    jsonkey.put(cell+"",demonid);
                }else{
                    demonid.put(begin+","+end,rowkey);
                }
                //最后一行结束特殊设置
                //设置数据
                System.out.println(jsonkey.toJSONString());
                if("".equals(data.toString())){
                    return "第"+(rowi+1)+"行第"+(cell+1)+"列内容不能为空";
                }
                uf_jcdcrw=new Uf_jcdcrw();
                uf_jcdcrw.setDomid(rowkey+"");

                //uf_jcdcrw.setLevelids(getlEVELByid(cell)); 重新计算 level
                String sssj=getSupid(jsonkey,(cell-1),rowi)+"";
                //jsonkey.put(rowkey+"",sssj);
                String level=getLevel(leveljson,rowkey+"",sssj,"");
                uf_jcdcrw.setLevelids(level); //重新计算 level

                leveljson.put(rowkey+"",sssj);
                System.out.println(leveljson.toJSONString());
                uf_jcdcrw.setSssj(sssj);
                uf_jcdcrw.setSsdctz("1");
                uf_jcdcrw.setGzrw(data.toString());
                uf_jcdcrw.setWfkey("123");
                if(cell==(cellz-1)){
                    //设置单位 以及 是任务
                    XWPFTableCell bmcell=(XWPFTableCell)row.getTableCells().get(cell+1);
                    if(bmcell!=null){
                        String bm=Util.null2String(bmcell.getText()).trim() ;
                        String newbm="123";//dubanTran.getSwDpartmentnameByName(bm);
                        String newbm1=getHbDepString(table,rowi,cell+1,jsonkey.getJSONObject(cell+""));
                        System.out.println("newbm1--"+newbm1);
                        if("".equals(newbm1)){
                            return "第"+(rowi+1)+"行第"+(cell+1)+"牵头单位不能为空";
                        }else{
                            uf_jcdcrw.setQtdw(newbm1);
                            uf_jcdcrw.setSfsrw(0);
                        }
                    }else{
                        return "第"+(rowi+1)+"行第"+(cell+1)+"牵头单位不能为空";
                    }
                }else{
                    uf_jcdcrw.setSfsrw(1);
                }
                List.add(uf_jcdcrw);
                rowkey++;

            }
        }
        //System.out.println(jsonkey.toString());
        //遍历所有的 List 前面加上  1-
        for(Uf_jcdcrw uf_jcdcrw1:List){
            if(uf_jcdcrw1!=null){
               String Levelids=uf_jcdcrw1.getLevelids();
                String newdomid=uf_jcdcrw1.getDomid();
                if(!"".equals(Levelids)&&!"1".equals(newdomid)){
                    Levelids="1-"+Levelids;
                }
                uf_jcdcrw1.setLevelids(Levelids);
            }
        }
        System.out.println(List.toString());
        return "";
    }
    /*
        获取 level
     */
    public static String getLevel(JSONObject JSON,String domid,String sssj,String src){
            if(JSON==null||JSON.size()<=0){
                return domid;
            }else{
                if("".equals(sssj)||"1".equals(sssj)){
                    return src+"-"+domid;
                }else{
                    String value=Util.null2String(JSON.getString(sssj)).trim() ;
                    if("".equals(value)||"1".equals(value)){
                        return sssj+src+"-"+domid;
                    }else{
                        //src=;
                        return getLevel(JSON,domid,value,("-"+sssj+src));
                    }
                }

            }

    }
    public static String qchx(String hx){
        hx=Util.null2String(hx);
        if(hx.startsWith("-")){
            hx=hx.substring(1);
        }
        if(hx.endsWith("-")){
            hx=hx.substring(0,hx.length()-1);
        }
        return hx;
    }
    /*
        获取部门  合并行的情况
     */
    public static String getHbDepString(XWPFTable table,int currentRow,int cel,JSONObject json){
        String bm="";
        if(table==null||currentRow<1||json==null||json.size()<=0||cel<0){
            return "";
        }else{
            Set<String> key=json.keySet();
            for(String str:key){
                str=Util.null2String(str).trim();
                if(!"".equals(str)&&str.split(",").length==2){
                    int begint=Util.getIntValue(str.split(",")[0],-1);
                    int endint=Util.getIntValue(str.split(",")[1],-1);
                    if(begint>0&&endint>0){
                        if(endint==currentRow){
                            List  rows =table.getRows();
                            for( int i=begint;i<=endint;i++){
                                XWPFTableCell xWPFTableCell=table.getRow(i).getCell(cel);
                                bm=bm+xWPFTableCell.getText()+",";
                            }
                        }
                    }
                }
            }
        }
        return bm;
    }

    /*
        判断是不是最后一个 true 表示下一个是合并的
     */
    public static boolean checkEnd(XWPFTableCell cell){
        if(cell==null){
            return false;
        }else{
            CTVMerge CTVMerge=cell.getCTTc().getTcPr().getVMerge();
            if(CTVMerge!=null&&CTVMerge.isSetVal()&&!"restart".equals(CTVMerge.getVal().toString())){
                System.out.println(CTVMerge.getVal());
                return true;
            }else{
                return false;
            }
        }
    }
    public static String getlEVELByid(int i){
        if(i==0){
            return "1";
        }else{
            String lEVEL="1";
            for(int i1=1;i1<=i;i1++){
                lEVEL=lEVEL+"-1"+(i1);
            }
            return lEVEL;
        }

    }
    /*
        获取paramid
     */
    public static String getSupid(JSONObject json,int cell,int currentrow){
        String supid="1";
        if(json!=null&&json.size()>0){
            JSONObject val= json.getJSONObject(cell+"");
            if(val!=null&&val.size()>0){
               Set<String> keys= val.keySet();
               for(String key:keys){
                   key=Util.null2String(key).trim();
                   if(!"".equals(key)&&key.split(",").length==2){
                       if(Util.getIntValue(key.split(",",-1)[0])<=currentrow&&currentrow<=Util.getIntValue(key.split(",",-1)[1])){
                           return val.getString(key);
                       }
                   }
               }
            }
        }
        return supid;
    }
    public static String setDataJson(JSONObject datajson,int lencel,int rowlen,String data,String bs){
           String newdata="";
           if(datajson!=null){
               JSONObject valueJson=datajson.getJSONObject(lencel+"");
                if(valueJson==null){
                    if("restart".equals(bs)){//开始
                        valueJson=new JSONObject();
                        valueJson.put("begrow",rowlen);
                        valueJson.put("max",rowlen);
                        valueJson.put("data",data);
                        datajson.put(lencel+"",valueJson);
                        newdata=data;
                    }else{
                        newdata=data;
                    }

                }else{
                    //结束或者继续
                    if("continue".equals(bs)){
                        int demomax= Util.getIntValue(valueJson.getString("max"),-1);
                        if(demomax==(rowlen-1)){
                            valueJson.put("max",rowlen);
                            newdata=valueJson.getString("data");
                        }
                    }else if("".equals(bs)||"restart".equals(bs)){
                        //结束
                        valueJson.put("endrow",rowlen);
                        valueJson.put("data",data);
                        newdata=data;
                    }
                }
           }
           return newdata;
    }
}
